#include <iostream>
#include <vector>

void f(const std::vector<int>& v)
{}

void f(void*)
{}

void f(int)
{}
// void f(const int&)
// {}

void f(void pf(int))
{}

template<typename T>
void fwd(T&& t) {
    f(std::forward<T>(t));
}


class Widget{
public:
    const static int Integer = 28;
    
    static int Integer1;
};

int Widget::Integer1 = 29;
const int Widget::Integer;

template<typename T>
void tFunc(T) {}

void func(int){}
void func(int ,int){}


struct Date {
   unsigned short nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned short nMonthDay : 6;    // 0..31  (6 bits)
   unsigned short nMonth    : 5;    // 0..12  (5 bits)
   unsigned short nYear     : 8;    // 0..100 (8 bits)
};

int main() {
    {
        //fwd({1, 2, 3})
        auto li = {1, 2, 3};
        fwd(li);
    }

    {    
        //fwd(NULL);
        //fwd(nullptr);
    }

    {
        //f(Widget::Integer1);
        fwd(Widget::Integer);

        f(Widget::Integer);
    }

    {
        //fwd(tFunc);

        f(func);

        using funcPtr = void(*)(int);
        funcPtr fptr = func;

        fwd(fptr);
        fwd(static_cast<funcPtr>(func));
    }

    {
        Date d;
        //auto& m = d.nMonth;
        auto m = static_cast<uint8_t>(d.nMonth);

        fwd(m);
    }

    return 0;
}